home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / mint / netlib / lib / sendmsg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-27  |  1.5 KB  |  78 lines

  1. /*
  2.  *    sendmsg() emulation for MiNT-Net, (w) '93, kay roemer
  3.  */
  4.  
  5. #include "socklib.h"
  6. #ifdef KERNEL
  7. #undef UNX2DOS
  8. #include "kerbind.h"
  9. #else
  10. #include <mintbind.h>
  11. #include <errno.h>
  12. #endif
  13. #include "sys/socket.h"
  14. #include "mintsock.h"
  15.  
  16. #ifdef UNX2DOS
  17. #include <string.h>
  18. #include "sys/un.h"
  19. #define UN_OFFSET    ((short)((struct sockaddr_un *)0)->sun_path)
  20. #endif
  21.  
  22. #ifndef KERNEL
  23. extern int errno;
  24. #endif
  25.  
  26. int
  27. sendmsg (fd, msg, flags)
  28.     int fd;
  29.     struct msghdr *msg;
  30.     int flags;
  31. {
  32.     struct sendmsg_cmd cmd;
  33.     int r;
  34. #ifdef UNX2DOS
  35.     struct msghdr new_msg;
  36.     struct sockaddr_un un, *unp = (struct sockaddr_un *)msg->msg_name;
  37.     extern int _unx2dos (const char *, char *);
  38.  
  39.     if (unp && unp->sun_family == AF_UNIX) {
  40.         if (msg->msg_namelen <= UN_OFFSET ||
  41.             msg->msg_namelen > sizeof (un)) {
  42.             errno = EINVAL;
  43.             return -1;
  44.         }
  45.  
  46.         un.sun_family = AF_UNIX;
  47.         _unx2dos (unp->sun_path, un.sun_path);
  48.         un.sun_path[sizeof (un.sun_path) - 1] = '\0';
  49.  
  50.         new_msg.msg_name = &un;
  51.         new_msg.msg_namelen = UN_OFFSET + strlen (un.sun_path);
  52.         new_msg.msg_iov = msg->msg_iov;
  53.         new_msg.msg_iovlen = msg->msg_iovlen;
  54.         new_msg.msg_accrights = msg->msg_accrights;
  55.         new_msg.msg_accrightslen = msg->msg_accrightslen;
  56.         
  57.         cmd.msg = &new_msg;
  58.     } else {
  59. #endif
  60.         cmd.msg = msg;
  61. #ifdef UNX2DOS
  62.     }
  63. #endif
  64.     cmd.cmd = SENDMSG_CMD;
  65.     cmd.flags = flags;
  66.  
  67. #ifdef KERNEL
  68.     r = f_cntl (fd, (long)&cmd, SOCKETCALL);
  69. #else
  70.     r = Fcntl (fd, (long)&cmd, SOCKETCALL);
  71.     if (r < 0) {
  72.         errno = -r;
  73.         return -1;
  74.     }
  75. #endif
  76.     return r;
  77. }
  78.